package com.example.loop.configuration.rabbitMq;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 获取rabbit mq 的消息之后，处理失败了，就放到死信队列中
 *
 * @author Liaorun
 */
@Configuration
public class ErrorMessageConfig {
    /**
     * @return 死信队列
     */
    @Bean
    public Queue errorQueue() {
        return QueueBuilder
                .durable("error.queue") // 重启不会丢失的队列
                .lazy() // 使用磁盘存储代替内存，提高容量牺牲性能
                .build();
    }

    /**
     * @return 到死信队列的交换机
     */
    @Bean
    public DirectExchange errorDirectExchange() {
        return new DirectExchange("error.direct");
    }


    /**
     * @return 绑定死信队列 和 交换机
     */
    @Bean
    public Binding errorMsgBinding() {
        return BindingBuilder.bind(errorQueue()).to(errorDirectExchange()).with("error");
    }


    /**
     * 更新获取rabbit mq 的消息之后，处理失败了，之后的策略
     * 就放到死信队列中，  没更新前不做任何处理，给消息队列发送确认收到，会导致消息丢失
     *
     * @param rabbitTemplate
     * @return
     */
    @Bean
    public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate) {
        return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error");
    }
}
